﻿#define _CRT_SECURE_NO_WARNINGS 1

#include <stdio.h>

//数组的初始化

//一维数组
//int main()
//{
//	int arr[10] = { 0 };//10个元素 限定了数组的大小
//	int arr2[] = { 0 };//这种数组只有1个元素 方括号里的可以省略 第一个元素给了0，所以是0
//	int arr3[20] = { 1,2,3,4,5,6,7,8,9,0 };  有二十个元素 超出的剩下都是0 最后有个\0结束符
//  这些都是不完全初始化数组
//  int arr3[10] = { 1,2,3,4,5,6,7,8,9,0 };//这是完全初始化
//	return 0;
//}


//二维数组
//int main()
//{
//	int data1[3][5] = {1,2,3,4,5,6,7,8};//不完全初始化 3行5列的二维数组元素  都是从0开始算
//	int data2[3][5] = { 0 };//不完全初始化
//	int data3[3][5] = { 1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7 };//完全初始化
//	int data4[3][5] = { {1,2},{3,4},{5,6} };//二维数组花括号括起来算一行
//
//
//	int data5[][5] = { 1,2,3,4,5,6,7,8 };//行可以省略 列不可以
//	int data6[][5] = { {1,2},{3,4},{5,6,7,8} };
//
//printf("%d\n",data3[2],[1]);//可以打印出 2行1列的元素 3
//
//	return 0;
//}

//int main()
//{
//	int arr[3][5] = { 0 };
//	//输入
//	int i = 0;
//	for (i = 0; i < 3; i++)//循环3次 第一次i就是二维数组的第一列 然后在第一行里面执行下面的程序
//	{
//		int j = 0;
//		for (j = 0; j < 5; j++)//进到i的第一次循环 就是第一行 在第一行里面循环五次 输出五列元素一次++  五次结束之后 第一行数组元素全部得出 
//		{
//			scanf("%d", &arr[i][j]);//输入数组元素要取地址下标 只是输入地址不用 数组名是地址 数组元素不是，所以要取地址
//			//前面给i，j只是给循环初始化 不会影响输入 每循环一次就放入每一次输入的值
//		}
//	}
//
//	//输出
//	for (i = 0; i < 3; i++)
//	{
//		int j = 0;
//		for (j = 0; j < 5; j++)
//		{
//			printf("%d ", arr[i][j]);//在这打印输出上面的输入元素
//		}
//		printf("\n");
//	}
//	return 0;
//}


//在C语言的C99标准之前，数组在创建的时候，数组大小的指定只能使用常量
//int main()
//{
//	int arr1[10];
//
//	int n = 10;
//	int arr2[n];//err
//
//	return 0;
//}

//在C99之后，C语言中引入了变长数组的概念，使得数组的大小可以使用变量来指定
//但是VS2022是不支持变长数组的
//DevC++ / 小熊猫C++ 底层使用的gcc，gcc支持C99中的变长数组的



//数组练习1
//#include<string.h>
////strlen函数可以求字符串长度 是求字符串长度的，只能针对字符串或者字符数组 要包含头文件#include<string.h>
//#include<windows.h>
//#include<stdlib.h>
//
//int main()
//{
//	char arr1[] = "hello word!!!!!!" ;
//	//展开arr1{hello word!!!!!!\0}
//	char arr2[] = "****************" ;//字符串可以省略花括号
//	int zuo = 0;//数组左下标 0开始
//	int you = strlen(arr1) - 1;//strlen函数可以求字符串长度 -1就是减去最后一个结束符\0 得到右下标
//	
//	while (zuo <= you)//循环来移动下标 得到效果 左边开始就是小于右边表达式成立 循环自加自减 会到中间的值 到中间的值也要输出 所以要<= 当左边大于右边后 表达式不成立 循环停止
//	{
//		arr2[zuo] = arr1[zuo];//将左右下标的元素赋予arr2这个数组 就是吧 h，!赋予arr2数组 变成 h***********! 
//		arr2[you] = arr1[you];
//		zuo++;//左下标增加 对下一位元素赋予arr2数组
//		you--;//右下标减少 对下一位元素赋予arr2数组
//		Sleep(1000);//Sleep 要大写休眠1000毫秒 就是延迟1000毫秒 但是只能在windows环境底下用 要添加头文件#include<windows.h>
//		system("cls");//清理控制台屏幕信息  system函数可以执行系统命令 要头文件#include<stdlib.h>
//		printf("%s\n", arr2);//%s占位符打印字符串
//	}
//	printf("%s\n", arr2);
//	return 0;
//}


//数组练习2
//int main()
//{
//	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
//
//	int k = 0;
//	scanf("%d", &k);//输入要查找的值，假设是7
//	int sz = sizeof(arr) / sizeof(arr[0]);//sizeof用来计算类型长度 在这用来计算这个arr数组有几个元素
//	//sizeof(arr)计算出有40个字节，一个元素4个字节 / sizeof(arr[0]计算出第0个位置有4个字节 40个字节除于4个字节 就得出这个arr数组有10个元素再赋予sz \0操作符是不会被计算出来的
//	int left = 0;//左下标
//	int right = sz-1;//-1是要减去最后一个\0操作符 右下标
//	
//	while (left<=right)//循环来移动下标 得到效果 左边开始就是小于右边表达式成立 循环自加自减 会到中间的值 到中间的值也要输出 所以要<= 当左边大于右边后 表达式不成立 循环停止
//	{
//		int mid = left+(right - left) / 2;//求出中间元素
//		if (arr[mid] < k)//如果中间值小于要查找的值
//		{
//			left = mid + 1;//左下标就要在中间值的基础上加1
//		}
//		else if (arr[mid] > k)
//		{
//			right = mid - 1;
//		}
//		else
//		{
//			printf("找到了，下标是%d\n", mid);
//			break;//跳出主程序 
//		}
//	}
//
//	if (left > right)
//	{
//		printf("找不到\n");
//	}
//	return 0;
//}
// 
// 
//库函数⽂档的⼀般格式
//1. 函数原型
//2. 函数功能介绍
//3. 参数和返回类型说明
//4. 代码举例
//5. 代码输出
//6. 相关知识链接
